home *** CD-ROM | disk | FTP | other *** search
/ Game.EXE 2001 January / execd1200.iso / Shareware / Blocks 3 / setup.exe / Source / BOMB.C < prev    next >
Encoding:
C/C++ Source or Header  |  2000-10-03  |  4.5 KB  |  165 lines

  1. #include <allegro.h>
  2. #include <jgmod.h>
  3. #include <blocks3.h>
  4.  
  5. void Blow_Box(int b_no)
  6. {
  7.  Add_Explode(box[b_no].x/32, box[b_no].y/32, box[b_no].z/8);
  8.  map[box[b_no].x/32][box[b_no].y/32][box[b_no].z/8] = RESERVE;
  9.  Del_Box(b_no);
  10. }
  11.  
  12. void Bomb_Prime_Laser(void)
  13. {
  14.  int i, j;
  15.  
  16.  for (i = 0; i < box_count; i++)
  17.  {
  18.   if (box[i].type & BOMB)
  19.   {
  20.    if ((!box[i].dx) && (!box[i].dy) && (!box[i].dz) &&
  21.        (map_laser[box[i].x/32][box[i].y/32][box[i].z/8]))
  22.    {
  23.     if (box[i].type == BOMB3)
  24.     {
  25.      for (j = 0; j < box_count; j++)
  26.      if (box[j].type == BOMB3)
  27.      {
  28.       Blow_Box(j);
  29.       j--;
  30.      }
  31.     }
  32.     else
  33.     {
  34.      Blow_Box(i);
  35.      i--;
  36.     }
  37.    }
  38.   }
  39.  }
  40. }
  41.  
  42. void Del_Box(int b_no)
  43. {
  44.  int i;
  45.  
  46.  for (i = b_no; i < box_count; i++)
  47.  {
  48.   box[i].x = box[i + 1].x;
  49.   box[i].y = box[i + 1].y;
  50.   box[i].z = box[i + 1].z;
  51.   box[i].dx = box[i + 1].dx;
  52.   box[i].dy = box[i + 1].dy;
  53.   box[i].dz = box[i + 1].dz;
  54.   box[i].type = box[i + 1].type;
  55.   box[i].dir = box[i + 1].dir;
  56.   box[i].pic = box[i + 1].pic;
  57.  }
  58.  box_count--;
  59. }
  60.  
  61. void Add_Explode(int x, int y, int z)
  62. {
  63.  explode[explode_count].x = x;
  64.  explode[explode_count].y = y;
  65.  explode[explode_count].z = z;
  66.  explode[explode_count].frame = 0;
  67.  explode[explode_count].type = map[x][y][z] & BOMB;
  68.  
  69.  explode_count++;
  70.  
  71.  Add_Sound(x, SFX_EXPLODE);
  72. }
  73.  
  74. void Del_Explode(int e_no)
  75. {
  76.  int i;
  77.  
  78.  for (i = e_no; i < explode_count; i++)
  79.  {
  80.   explode[i].x = explode[i + 1].x;
  81.   explode[i].y = explode[i + 1].y;
  82.   explode[i].z = explode[i + 1].z;
  83.   explode[i].frame = explode[i + 1].frame;
  84.   explode[i].type = explode[i + 1].type;
  85.  }
  86.  
  87.  explode_count--;
  88. }
  89.  
  90. void Draw_Explode(void)
  91. {
  92.  int i;
  93.  
  94.  for (i = 0; i < explode_count; i++)
  95.  {
  96.   explode[i].frame++;
  97.  
  98.   if (explode[i].frame/10 == 0) DirtyList(explode[i].x * 32, explode[i].y * 32, explode[i].z * 8, 32, 40, explode_pic[0]);
  99.   if (explode[i].frame/10 == 1) DirtyList(explode[i].x * 32, explode[i].y * 32, explode[i].z * 8, 32, 40, explode_pic[1]);
  100.   if (explode[i].frame/10 == 2) DirtyList(explode[i].x * 32, explode[i].y * 32, explode[i].z * 8, 32, 40, explode_pic[2]);
  101.   if (explode[i].frame/10 == 3) DirtyList(explode[i].x * 32, explode[i].y * 32, explode[i].z * 8, 32, 40, explode_pic[3]);
  102.   if (explode[i].frame/10 == 4) DirtyList(explode[i].x * 32, explode[i].y * 32, explode[i].z * 8, 32, 40, explode_pic[4]);
  103.   if (explode[i].frame/10 == 5) DirtyList(explode[i].x * 32, explode[i].y * 32, explode[i].z * 8, 32, 40, explode_pic[5]);
  104.   if (explode[i].frame/10 == 6) DirtyList(explode[i].x * 32, explode[i].y * 32, explode[i].z * 8, 32, 40, explode_pic[6]);
  105.   if (explode[i].frame/10 == 7) DirtyList(explode[i].x * 32, explode[i].y * 32, explode[i].z * 8, 32, 40, explode_pic[7]);
  106.  
  107.   if (explode[i].frame/10 == 8)
  108.   {
  109.    DirtyList(explode[i].x * 32, explode[i].y * 32, explode[i].z * 8, 32, 40, blank);
  110.  
  111.    if (explode[i].type == BOMB) Explode_Prime_Chain(explode[i].x, explode[i].y);
  112.  
  113.    map[explode[i].x][explode[i].y][explode[i].z] = 0;
  114.    Del_Explode(i);
  115.    i--;
  116.   }
  117.  }
  118. }
  119.  
  120. void Explode_Prime_Chain(int x, int y)
  121. {
  122.  if (map[x][y][0] & BLOWUP)     Explode_Prime(x, y, 0);
  123.  if (map[x][y][1] & BLOWUP)     Explode_Prime(x, y, 1);
  124.  
  125.  if (map[x][y - 1][0] & BLOWUP)     Explode_Prime(x, y - 1, 0);
  126.  if (map[x + 1][y - 1][0] & BLOWUP) Explode_Prime(x + 1, y - 1, 0);
  127.  if (map[x + 1][y][0] & BLOWUP)     Explode_Prime(x + 1, y, 0);
  128.  if (map[x + 1][y + 1][0] & BLOWUP) Explode_Prime(x + 1, y + 1, 0);
  129.  if (map[x][y + 1][0] & BLOWUP)     Explode_Prime(x, y + 1, 0);
  130.  if (map[x - 1][y + 1][0] & BLOWUP) Explode_Prime(x - 1, y + 1, 0);
  131.  if (map[x - 1][y][0] & BLOWUP)     Explode_Prime(x - 1, y, 0);
  132.  if (map[x - 1][y - 1][0] & BLOWUP) Explode_Prime(x - 1, y - 1, 0);
  133.  
  134.  if (map[x][y - 1][1] & BLOWUP)     Explode_Prime(x, y - 1, 1);
  135.  if (map[x + 1][y - 1][1] & BLOWUP) Explode_Prime(x + 1, y - 1, 1);
  136.  if (map[x + 1][y][1] & BLOWUP)     Explode_Prime(x + 1, y, 1);
  137.  if (map[x + 1][y + 1][1] & BLOWUP) Explode_Prime(x + 1, y + 1, 1);
  138.  if (map[x][y + 1][1] & BLOWUP)     Explode_Prime(x, y + 1, 1);
  139.  if (map[x - 1][y + 1][1] & BLOWUP) Explode_Prime(x - 1, y + 1, 1);
  140.  if (map[x - 1][y][1] & BLOWUP)     Explode_Prime(x - 1, y, 1);
  141.  if (map[x - 1][y - 1][1] & BLOWUP) Explode_Prime(x - 1, y - 1, 1);
  142.  
  143. }
  144.  
  145. void Explode_Prime(int x, int y, int z)
  146. {
  147.  int i, j;
  148.  
  149.  i = 0;
  150.  
  151.  while ((box[i].x/32 != x) || (box[i].y/32 != y)  || (box[i].z/8 != z))
  152.  i++;
  153.  
  154.  if (box[i].type == BOMB3)
  155.  {
  156.   for (j = 0; j < box_count; j++)
  157.   if (box[j].type == BOMB3)
  158.   {
  159.    Blow_Box(j);
  160.    j--;
  161.   }
  162.  }
  163.  else Blow_Box(i);
  164. }
  165.